home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / ddj0897.zip / DYN401.ZIP / class / array.c next >
C/C++ Source or Header  |  1997-04-16  |  23KB  |  832 lines

  1.  
  2.  
  3. /*  Copyright (c) 1993-1996 Algorithms Corporation  */
  4. /*  All rights reserved.  */
  5.  
  6.  
  7.  
  8.  
  9. /*  This file automatically generated by dpp - do not edit  */
  10.  
  11. #define    DPP_STRATEGY    2
  12. #define    DPP_FASTWIDE    0
  13.  
  14.  
  15.  
  16. #line 19 "array.d"
  17. #include <string.h> 
  18. #include "memalloc.h" 
  19.  
  20.  
  21. #include "array1.h" 
  22. #include "array2.h" 
  23.  
  24. #define    CLASS    Array_c
  25. #define    ivType    Array_iv_t
  26.  
  27. #include "generics.h"
  28.  
  29. object    Array_c;
  30.  
  31.  
  32. #line 33 "array.c"
  33. typedef struct  _Array_iv_t  {
  34.     char iType;
  35.     unsigned iRank;
  36.     INDEX_TYPE * iShape;
  37.     INDEX_TYPE iNelm;
  38.     void * iArray;
  39.     void * iRmp;
  40. }    Array_iv_t;
  41.  
  42.  
  43. #line 38 "array.d"
  44. static int Index_origin = 0; 
  45.  
  46. static int _A_esize(int type); 
  47. static void print_val(object str,ivType *iv,char *fmt1,char *fmt2); 
  48. static void p_val_mat(object str,unsigned rank,unsigned *shape,char **val ,int size,char *fmt,unsigned *bit_indx,char *buf, int typ); 
  49. static objrtn print_nest(object s, ivType *iv); 
  50. static objrtn Dup(object self,int ntype,int dval,int deep); 
  51. static int convert(ivType *iv,ivType *iv2); 
  52.  
  53.  
  54.  
  55. static unsigned char pow1[] = { 1, 2, 4, 8, 16, 32, 64, 128 }; 
  56. static unsigned char pow2[] = { ~1, ~2, ~4, ~8, ~16, ~32, ~64, 
  57.         (unsigned char)~128 }; 
  58.  
  59. static char OOB[] = "Error: Out of bounds array index.\n"; 
  60.  
  61.  
  62. cmeth objrtn Array_cm_gNew(object self)
  63.     return gShouldNotImplement(self, "gNew"); 
  64.  
  65. cmeth objrtn Array_cm_gNewArray(object self, int type, int rank, va_list _rest_)
  66.     int i; 
  67.     INDEX_TYPE n; 
  68.     object array = oSuper(Array_c, gNew, self)(self); 
  69.     ivType *iv = ivPtr(array); 
  70.  
  71.     iv->iType = type; 
  72.     iv->iRank = rank; 
  73.     iv->iShape = rank ? MTnalloc(INDEX_TYPE, rank, iv->iShape) : (INDEX_TYPE *) NULL; 
  74.     for (i=0, n=1 ; i < rank ; ++i) 
  75.         n *= iv->iShape[i] = GetArg(unsigned); 
  76.     iv->iNelm = n; 
  77.     if (type == AT_OBJ) { 
  78.         iv->iArray = n ? Tncalloc(char, (unsigned) SIZE(type, n)) : NULL; 
  79.         iv->iRmp = gRegisterMemory(Dynace, iv->iArray, (long) SIZE(type, n)); 
  80.     } else 
  81.         iv->iArray = n ? MTncalloc(char, (unsigned) SIZE(type, n), iv->iArray) : NULL; 
  82.     return array; 
  83.  
  84.  
  85.  
  86. static objrtn NewArray(object self, int type, int rank, unsigned *idx)
  87.     int i; 
  88.     INDEX_TYPE n; 
  89.     object array = oSuper(Array_c, gNew, self)(self); 
  90.     ivType *iv = ivPtr(array); 
  91.  
  92.     iv->iType = type; 
  93.     iv->iRank = rank; 
  94.     iv->iShape = rank ? MTnalloc(INDEX_TYPE, rank, iv->iShape) : (INDEX_TYPE *) NULL; 
  95.     for (i=0, n=1 ; i < rank ; ++i) 
  96.         n *= iv->iShape[i] = idx[i]; 
  97.     iv->iNelm = n; 
  98.     if (type == AT_OBJ) { 
  99.         iv->iArray = n ? Tncalloc(char, (unsigned) SIZE(type, n)) : NULL; 
  100.         iv->iRmp = gRegisterMemory(Dynace, iv->iArray, (long) SIZE(type, n)); 
  101.     } else 
  102.         iv->iArray = n ? MTncalloc(char, (unsigned) SIZE(type, n), iv->iArray) : NULL; 
  103.     return array; 
  104.  
  105. imeth objrtn Array_im_gDispose(object self)
  106. { Array_iv_t *iv = GetIVs(Array, self);
  107.     if (iv->iShape) 
  108.         MA_free(iv->iShape); 
  109.     if (iv->iArray) 
  110.         if (iv->iType == AT_OBJ) 
  111.         free(iv->iArray); 
  112.     else 
  113.         MA_free(iv->iArray); 
  114.     if (iv->iRmp) 
  115.         gRemoveRegisteredMemory(Dynace, iv->iRmp); 
  116.     oSuper(Array_c, gDispose, self)(self); 
  117.     return NULL; 
  118.  
  119. imeth objrtn Array_im_gDeepDispose(object self)
  120. { Array_iv_t *iv = GetIVs(Array, self);
  121.     object *v; 
  122.     INDEX_TYPE i; 
  123.  
  124.     if (iv->iType == AT_OBJ) { 
  125.         v = (object *) iv->iArray; 
  126.         for (i=0 ; i != iv->iNelm ; ++i) 
  127.             if (v[i]) { 
  128.             gDeepDispose(v[i]); 
  129.             v[i] = NULL; 
  130.         } 
  131.     } 
  132.  
  133.     if (iv->iShape) 
  134.         MA_free(iv->iShape); 
  135.     if (iv->iArray) 
  136.         if (iv->iType == AT_OBJ) 
  137.         free(iv->iArray); 
  138.     else 
  139.         MA_free(iv->iArray); 
  140.     if (iv->iRmp) 
  141.         gRemoveRegisteredMemory(Dynace, iv->iRmp); 
  142.     oSuper(Array_c, gDispose, self)(self); 
  143.     return NULL; 
  144.  
  145. imeth void * Array_im_gArrayPointer(object self)
  146. { Array_iv_t *iv = GetIVs(Array, self);
  147.     return iv->iArray; 
  148.  
  149. imeth unsigned Array_im_gRank(object self)
  150. { Array_iv_t *iv = GetIVs(Array, self);
  151.     return iv->iRank; 
  152.  
  153. imeth objrtn Array_im_gShape(object self)
  154. { Array_iv_t *iv = GetIVs(Array, self);
  155.     unsigned i; 
  156.     object r; 
  157.     ivType *iv2; 
  158.  
  159.     r = vNew(ShortArray, 1, iv->iRank); 
  160.     iv2 = ivPtr(r); 
  161.  
  162.     for (i=0 ; i < iv->iRank ; ++i) 
  163.         ((INDEX_TYPE *) iv2->iArray)[i] = iv->iShape[i]; 
  164.  
  165.     return r; 
  166.  
  167. imeth void * Array_im_gIndex(object self, va_list _rest_)
  168. { Array_iv_t *iv = GetIVs(Array, self);
  169.     INDEX_TYPE offset, r, i; 
  170.  
  171.     if (iv->iType == AT_BIT) 
  172.         gError(self, "Cannot use gIndex on BitArray\n"); 
  173.     if (!iv->iRank) 
  174.         return iv->iArray; 
  175.     r = iv->iRank - 1; 
  176.     for (i=0, offset=(INDEX_TYPE) 0 ; i <= r ; ++i) { 
  177.         INDEX_TYPE m, n, j; 
  178.  
  179.         n = GetArg(unsigned) - Index_origin; 
  180.         if (n >= iv->iShape[i]) 
  181.             gError(self, OOB); 
  182.         for (m=1, j=r ; j != i ; ) 
  183.             m *= iv->iShape[j--]; 
  184.         if (!m) 
  185.             gError(self, OOB); 
  186.         offset += m * n; 
  187.     } 
  188.     return (void *) ((char *) iv->iArray + _A_esize(iv->iType) * offset); 
  189.  
  190. ivmeth int Array_ivm_vBitValue(object self, va_list _rest_)
  191. { Array_iv_t *iv = GetIVs(Array, self);
  192.     int i, r; 
  193.     INDEX_TYPE offset; 
  194.     MAKE_REST(self); 
  195.  
  196.     if (iv->iType != AT_BIT) 
  197.         gError(self, "Error: Can't use vBitValue on non-BitArrays\n"); 
  198.     r = iv->iRank - 1; 
  199.     for (i=0, offset=(INDEX_TYPE) 0 ; i <= r ; ++i) { 
  200.         INDEX_TYPE m; 
  201.         INDEX_TYPE n; 
  202.         register int j; 
  203.  
  204.         n = GetArg(INDEX_TYPE) - Index_origin; 
  205.         if (n >= iv->iShape[i]) 
  206.             gError(self, OOB); 
  207.         for (m=1, j=r ; j != i ; ) 
  208.             m *= iv->iShape[j--]; 
  209.         if (!m) 
  210.             gError(self, OOB); 
  211.         offset += m * n; 
  212.     } 
  213.     return !!BIT_VAL(iv->iArray, offset); 
  214.  
  215. #line 229 "array.c"
  216.  
  217. static    int    Array_ifm_vBitValue(object self, ...)
  218. {
  219.     va_list    _rest_;
  220.     va_start(_rest_, self);
  221.     return Array_ivm_vBitValue(self, _rest_);
  222. }
  223.  
  224.  
  225.  
  226. #line 222 "array.d"
  227. ivmeth objrtn Array_ivm_vChangeBitValue(object self, va_list _rest_)
  228. { Array_iv_t *iv = GetIVs(Array, self);int v = va_arg(_rest_, int);
  229.     int i, r; 
  230.     INDEX_TYPE offset; 
  231.     MAKE_REST(v); 
  232.  
  233.     if (iv->iType != AT_BIT) 
  234.         gError(self, "Error: Can't use vChangeBitValue on non-BitArrays\n"); 
  235.     r = iv->iRank - 1; 
  236.     for (i=0, offset=(INDEX_TYPE) 0 ; i <= r ; ++i) { 
  237.         INDEX_TYPE m; 
  238.         INDEX_TYPE n; 
  239.         register int j; 
  240.  
  241.         n = GetArg(INDEX_TYPE) - Index_origin; 
  242.         if (n >= iv->iShape[i]) 
  243.             gError(self, OOB); 
  244.         for (m=1, j=r ; j != i ; ) 
  245.             m *= iv->iShape[j--]; 
  246.         if (!m) 
  247.             gError(self, OOB); 
  248.         offset += m * n; 
  249.     } 
  250.     SET_BIT(iv->iArray, offset, v); 
  251.     return self; 
  252.  
  253. #line 268 "array.c"
  254.  
  255. static    objrtn    Array_ifm_vChangeBitValue(object self, ...)
  256. {
  257.     va_list    _rest_;
  258.     va_start(_rest_, self);
  259.     return Array_ivm_vChangeBitValue(self, _rest_);
  260. }
  261.  
  262.  
  263.  
  264. #line 249 "array.d"
  265. cmeth objrtn Array_cm_gIota(object self, int n)
  266.     INDEX_TYPE c; 
  267.     int i; 
  268.     object a; 
  269.     ivType *iv; 
  270.  
  271.     USE(self); 
  272.     a = vNew(ShortArray, 1, n); 
  273.     iv = ivPtr(a); 
  274.     for (c=Index_origin, i=0 ; i < n ; ) 
  275.         ((short *) iv->iArray)[i++] = c++; 
  276.     return a; 
  277.  
  278. ivmeth objrtn Array_ivm_vReshape(object self, va_list _rest_)
  279. { Array_iv_t *iv = GetIVs(Array, self);unsigned rank = va_arg(_rest_, unsigned);
  280.     INDEX_TYPE n, *shape, d, i; 
  281.     MAKE_REST(rank); 
  282.  
  283.     shape = rank ? MTnalloc(INDEX_TYPE, rank, iv->iShape) : (INDEX_TYPE *) NULL; 
  284.     for (i=0, n=1 ; i < rank ; ++i) { 
  285.         d = GetArg(INDEX_TYPE); 
  286.         n *= d; 
  287.         shape[i] = d; 
  288.     } 
  289.  
  290.     if (iv->iNelm != n) { 
  291.         char *fp, *tp; 
  292.         void *array; 
  293.         INDEX_TYPE s1, s2, s1org; 
  294.  
  295.         s1org = s1 = SIZE(iv->iType, iv->iNelm); 
  296.         s2 = SIZE(iv->iType, n); 
  297.         if (iv->iType == AT_OBJ) 
  298.             array = n ? Tncalloc(char, s2) : NULL; 
  299.         else 
  300.             array = n ? MTncalloc(char, s2, iv->iArray) : NULL; 
  301.  
  302.         fp = (char *) iv->iArray; 
  303.         tp = (char *) array; 
  304.         while (s2) { 
  305.             unsigned m; 
  306.  
  307.             m = s2 < s1 ? s2 : s1; 
  308.             memcpy(tp, fp, m); 
  309.             s2 -= m; 
  310.             s1 -= m; 
  311.             if (!s1) { 
  312.                 fp = (char *) iv->iArray; 
  313.                 s1 = s1org; 
  314.             } else 
  315.                 fp += m; 
  316.             tp += m; 
  317.         } 
  318.         if (iv->iArray) 
  319.             if (iv->iType == AT_OBJ) 
  320.             free(iv->iArray); 
  321.         else 
  322.             MA_free(iv->iArray); 
  323.         iv->iArray = array; 
  324.  
  325.         iv->iNelm = n; 
  326.         if (iv->iType == AT_OBJ) { 
  327.             void *rmp = gRegisterMemory(Dynace, iv->iArray, (long) SIZE(iv->iType, iv->iNelm)); 
  328.             gRemoveRegisteredMemory(Dynace, iv->iRmp); 
  329.             iv->iRmp = rmp; 
  330.         } 
  331.     } 
  332.     iv->iRank = rank; 
  333.     if (iv->iShape) 
  334.         MA_free(iv->iShape); 
  335.     iv->iShape = shape; 
  336.  
  337.     return self; 
  338.  
  339. #line 357 "array.c"
  340.  
  341. static    objrtn    Array_ifm_vReshape(object self, ...)
  342. {
  343.     va_list    _rest_;
  344.     va_start(_rest_, self);
  345.     return Array_ivm_vReshape(self, _rest_);
  346. }
  347.  
  348.  
  349. #line 328 "array.d"
  350. static int _A_esize(int type) 
  351.     switch (type) { 
  352.         case AT_CHAR: return sizeof(char); 
  353.         case AT_SHRT: return sizeof(short); 
  354.         case AT_USHT: return sizeof(_ushort); 
  355.         case AT_INT: return sizeof(int); 
  356.         case AT_LONG: return sizeof(long); 
  357.         case AT_FLOT: return sizeof(float); 
  358.         case AT_DBLE: return sizeof(double); 
  359.         case AT_OBJ: return sizeof(object); 
  360.         case AT_BIT: return 0; 
  361.         case AT_PNTR: return sizeof(char *); 
  362.         default: return 0; 
  363.     } 
  364.  
  365. imeth int Array_im_gSize(object self)
  366. { Array_iv_t *iv = GetIVs(Array, self);
  367.     return iv->iNelm; 
  368.  
  369. imeth int Array_im_gEqual(object self, object obj)
  370. { Array_iv_t *iv = GetIVs(Array, self);
  371.     ivType *iv2; 
  372.     unsigned i; 
  373.  
  374.     ChkArg(obj, 2); 
  375.     if (!gIsKindOf(obj, CLASS)) 
  376.         return 0; 
  377.     iv2 = ivPtr(obj); 
  378.     if (iv->iType != iv2->iType || iv->iRank != iv2->iRank || iv->iNelm != iv2->iNelm) 
  379.         return 0; 
  380.     for (i=0 ; i < iv->iRank ; ++i) 
  381.         if (iv->iShape[i] != iv2->iShape[i]) 
  382.         return 0; 
  383.     return iv->iArray ? !memcmp(iv->iArray, iv2->iArray, (int) SIZE(iv->iType, iv->iNelm)) : 1; 
  384.  
  385. imeth objrtn Array_im_gStringRepValue(object self)
  386. { Array_iv_t *iv = GetIVs(Array, self);
  387.     object s; 
  388.  
  389.     s = gNew(String); 
  390.     switch (iv->iType) { 
  391.         case AT_CHAR: print_val(s, iv, "%c", "%c"); break; 
  392.         case AT_SHRT: print_val(s, iv, "%hd ", "%6hd "); break; 
  393.         case AT_USHT: print_val(s, iv, "%hu ", "%5hu "); break; 
  394.         case AT_INT: print_val(s, iv, "%d ", "%6d "); break; 
  395.         case AT_LONG: print_val(s, iv, "%ld ", "%10ld "); break; 
  396.         case AT_FLOT: print_val(s, iv, "%hf ", "%10.2hf "); break; 
  397.         case AT_DBLE: print_val(s, iv, "%lf ", "%10.2lf "); break; 
  398.         case AT_OBJ: print_nest(s, iv); break; 
  399.         case AT_BIT: print_val(s, iv, "%d ", "%1d "); break; 
  400.         case AT_PNTR: print_val(s, iv, "%lx ", "%8lx "); break; 
  401.     } 
  402.     return s; 
  403.  
  404. imeth objrtn Array_im_gStringRep(object self)
  405. { Array_iv_t *iv = GetIVs(Array, self);
  406.     char *t, buf[60]; 
  407.     object s; 
  408.  
  409.     switch (iv->iType) { 
  410.         case AT_CHAR: t = "Character"; break; 
  411.         case AT_SHRT: t = "Short"; break; 
  412.         case AT_USHT: t = "Unsigned Short"; break; 
  413.         case AT_INT: t = "Integer"; break; 
  414.         case AT_LONG: t = "Long"; break; 
  415.         case AT_FLOT: t = "Float"; break; 
  416.         case AT_DBLE: t = "Double"; break; 
  417.         case AT_OBJ: t = "Object Array"; break; 
  418.         case AT_BIT: t = "Bit"; break; 
  419.         case AT_PNTR: t = "Pointer"; break; 
  420.         default: t = "Unknown"; break; 
  421.     } 
  422.     s = vSprintf(String, "Type  = %s\n", t); 
  423.     sprintf(buf, "Rank  = %d\n", (int) iv->iRank); 
  424.     gAppend(s, (object) buf); 
  425.  
  426.     if (iv->iRank) { 
  427.         unsigned i; 
  428.  
  429.         gAppend(s, (object) "Shape = "); 
  430.         for (i=0 ; i < iv->iRank ; ) { 
  431.             sprintf(buf, PRNT_SHAPE, iv->iShape[i++]); 
  432.             gAppend(s, (object) buf); 
  433.         } 
  434.         gAppend(s, (object) "\n"); 
  435.     } 
  436.     gAppend(s, (object) "Value = "); 
  437.     switch (iv->iType) { 
  438.         case AT_CHAR: print_val(s, iv, "%c", "%c"); break; 
  439.         case AT_SHRT: print_val(s, iv, "%hd ", "%6hd "); break; 
  440.         case AT_USHT: print_val(s, iv, "%hu ", "%5hu "); break; 
  441.         case AT_INT: print_val(s, iv, "%d ", "%6d "); break; 
  442.         case AT_LONG: print_val(s, iv, "%ld ", "%10ld "); break; 
  443.         case AT_FLOT: print_val(s, iv, "%hf ", "%10.2hf "); break; 
  444.         case AT_DBLE: print_val(s, iv, "%lf ", "%10.2lf "); break; 
  445.         case AT_OBJ: print_nest(s, iv); break; 
  446.         case AT_BIT: print_val(s, iv, "%d ", "%1d "); break; 
  447.         case AT_PNTR: print_val(s, iv, "%lx ", "%8lx "); break; 
  448.     } 
  449.     return s; 
  450.  
  451. static void _fmt(char *buf, char *fmt, void *var, int typ) 
  452.     switch (typ) { 
  453.         case AT_CHAR: sprintf(buf, fmt, *((char *) var)); break; 
  454.         case AT_SHRT: sprintf(buf, fmt, *((short *) var)); break; 
  455.         case AT_USHT: sprintf(buf, fmt, *((_ushort *) var)); break; 
  456.         case AT_INT: sprintf(buf, fmt, *((int *) var)); break; 
  457.         case AT_LONG: sprintf(buf, fmt, *((long *) var)); break; 
  458.         case AT_FLOT: sprintf(buf, fmt, *((float *) var)); break; 
  459.         case AT_DBLE: sprintf(buf, fmt, *((double *) var)); break; 
  460.         case AT_OBJ: sprintf(buf, fmt, *((object *) var)); break; 
  461.         case AT_PNTR: sprintf(buf, fmt, *((void **) var)); break; 
  462.     } 
  463.  
  464. static void print_val(object str, ivType *iv, char *fmt1, char *fmt2) 
  465.     INDEX_TYPE i, bit_indx = 0; 
  466.     int s = _A_esize(iv->iType); 
  467.     char buf[60], *val; 
  468.  
  469.     switch (iv->iRank) { 
  470.         case 0: if (iv->iType != AT_BIT) { 
  471.             _fmt(buf, fmt1, iv->iArray, iv->iType); 
  472.             if (iv->iType == AT_CHAR) 
  473.                 vBuild(str, NULL, "\"", buf, "\"\n", NULL); 
  474.             else 
  475.                 vBuild(str, NULL, buf, "\n", NULL); 
  476.         } else { 
  477.             sprintf(buf, fmt1, !!BIT_VAL(iv->iArray, 0)); 
  478.             vBuild(str, NULL, buf, "\n", NULL); 
  479.         } 
  480.         break; 
  481.         case 1: if (iv->iType != AT_BIT) { 
  482.             if (iv->iType == AT_CHAR) 
  483.                 gAppend(str, (object) "\""); 
  484.             val = (char *) iv->iArray; 
  485.             for (i=0 ; i++ != *iv->iShape ; val+=s) { 
  486.                 _fmt(buf, fmt1, val, iv->iType); 
  487.                 gAppend(str, (object) buf); 
  488.             } 
  489.             if (iv->iType == AT_CHAR) 
  490.                 gAppend(str, (object) "\""); 
  491.         } else 
  492.             for (i=0 ; i != *iv->iShape ; ++i) { 
  493.             sprintf(buf, fmt1, !!BIT_VAL(val, i)); 
  494.             gAppend(str, (object) buf); 
  495.         } 
  496.         gAppend(str, (object) "\n"); 
  497.         break; 
  498.         default:gAppend(str, (object) "\n\n"); 
  499.         val = (char *) iv->iArray; 
  500.         p_val_mat(str, iv->iRank, iv->iShape, &val, s, fmt2, &bit_indx, buf, iv->iType); 
  501.     } 
  502.  
  503. static void p_val_mat(object str, unsigned rank, INDEX_TYPE *shape, char **val, int size, char *fmt, INDEX_TYPE *bit_indx, char *buf, int type) 
  504.     INDEX_TYPE r, c; 
  505.  
  506.     if (rank == 2) 
  507.         if (size) 
  508.         for (r=0 ; r++ != *shape ; ) { 
  509.         for (c=0 ; c++ != shape[1] ; (*val)+=size) { 
  510.             _fmt(buf, fmt, *val, type); 
  511.             gAppend(str, (object) buf); 
  512.         } 
  513.         gAppend(str, (object) "\n"); 
  514.     } 
  515.     else 
  516.         for (r=0 ; r++ != *shape ; ) { 
  517.         for (c=0 ; c++ != shape[1] ; (*bit_indx)++) { 
  518.             sprintf(buf, fmt, !!BIT_VAL(*val, *bit_indx)); 
  519.             gAppend(str, (object) buf); 
  520.         } 
  521.         gAppend(str, (object) "\n"); 
  522.     } 
  523.     else 
  524.         for (r=0 ; r++ != *shape ; ) { 
  525.         p_val_mat(str, rank-1, shape+1, val, size, fmt, bit_indx, buf, type); 
  526.         gAppend(str, (object) "\n"); 
  527.     } 
  528.  
  529. static objrtn print_nest(object s, ivType *iv) 
  530.     INDEX_TYPE i; 
  531.     object *val = (object *) iv->iArray; 
  532.     object t; 
  533.  
  534.     for (i=0 ; i++ != iv->iNelm ; ) { 
  535.         if (t = *val++) { 
  536.             t = gStringRepValue(*val++); 
  537.             vBuild(s, NULL, "\n", t, "\n", NULL); 
  538.             gDispose(t); 
  539.         } else 
  540.             gAppend(s, (object) "NULL\n"); 
  541.     } 
  542.     return s; 
  543.  
  544.  
  545.  
  546. static objrtn Dup(object self, int ntype, int dval, int deep)
  547.  
  548.  
  549.  
  550. { Array_iv_t *iv = GetIVs(Array, self);
  551.     register unsigned i; 
  552.     object narray, cls; 
  553.     ivType *iv2; 
  554.  
  555.     if (!ntype) 
  556.         ntype = iv->iType; 
  557.     if (ntype != iv->iType && ( 
  558.         ntype == AT_OBJ || ntype == AT_PNTR || 
  559.         iv->iType == AT_OBJ || iv->iType == AT_PNTR)) 
  560.         gError(self, "Error:  Can't convert array to requested type.\n"); 
  561.  
  562.     switch (ntype) { 
  563.         case AT_CHAR: cls = CharacterArray; break; 
  564.         case AT_SHRT: cls = ShortArray; break; 
  565.         case AT_USHT: cls = UnsignedShortArray; break; 
  566.         case AT_INT: cls = IntegerArray; break; 
  567.         case AT_LONG: cls = LongArray; break; 
  568.         case AT_FLOT: cls = FloatArray; break; 
  569.         case AT_DBLE: cls = DoubleFloatArray; break; 
  570.         case AT_BIT: cls = BitArray; break; 
  571.         case AT_OBJ: cls = ObjectArray; break; 
  572.         case AT_PNTR: cls = PointerArray; break; 
  573.         default: cls = NULL; break; 
  574.     } 
  575.     narray = NewArray(cls, ntype, iv->iRank, iv->iShape); 
  576.     iv2 = ivPtr(narray); 
  577.  
  578.     if (dval) 
  579.         if (ntype == iv->iType) 
  580.         if (iv->iType == AT_OBJ && deep) { 
  581.         object *fv = (object *) iv->iArray; 
  582.         object *tv = (object *) iv2->iArray; 
  583.         for (i=0 ; i != iv->iNelm ; ++i) 
  584.             if (fv[i]) 
  585.             tv[i] = gDeepCopy(fv[i]); 
  586.     } else 
  587.         memcpy(iv2->iArray, iv->iArray, (int) SIZE(iv->iType, iv->iNelm)); 
  588.     else 
  589.         convert(iv, iv2); 
  590.     return narray; 
  591.  
  592. #define Ftod(x) (double)(x) 
  593. #define Dtol(x) (long)(x) 
  594.  
  595. #if 0 
  596. #define CONV(tt, ft) while (n--) *((tt *) nval)++ = (tt) *((ft *) val)++ 
  597. #define CONVFI(tt, ft) while (n--) *((tt *) nval)++ = (tt) Dtol((double)*((ft *) val)++) 
  598. #define CONVFD() while (n--) *((double *) nval)++ = Ftod(*((float *) val)++) 
  599. #define CONVFB(tt) while (n--) *((tt *) nval)++ = (tt) !!BIT_VAL(val, n) 
  600. #define CONVTB(ft) for (m=0 ; m != n ; m++) SET_BIT(nval, m, *((ft *) val)++) 
  601. #else 
  602.  
  603. #line 600 "array.d"
  604. #define CONV(tt, ft) while (n--) { *((tt *) nval) = (tt) *((ft *) val); nval = (void *) (1 + (tt *) nval); val = (void *) (1 + (ft *) val); } 
  605.  
  606. #line 606 "array.d"
  607. #define CONVFI(tt, ft) while (n--) { *((tt *) nval) = (tt) Dtol((double)*(ft *) val); nval = (void *) (1 + (tt *) nval); val = (void *) (1 + (ft *) val); } 
  608.  
  609. #line 612 "array.d"
  610. #define CONVFD() while (n--) { *((double *) nval) = Ftod(*((float *) val)); nval = (void *) (1 + (double *) nval); val = (void *) (1 + (float *) val); } 
  611.  
  612.  
  613.  
  614.  
  615. #define CONVFB(tt) while (n--) { *((tt *) nval) = (tt) !!BIT_VAL(val, n); nval = (void *) (1 + (tt *) nval); } 
  616.  
  617.  
  618.  
  619.  
  620. #define CONVTB(ft) for (m=0 ; m != n ; m++) { SET_BIT(nval, m, *((ft *) val)); val = (void *) (1 + (ft *) val); } 
  621. #endif 
  622.  
  623. static int convert(ivType *iv, ivType *iv2) 
  624.     INDEX_TYPE m; 
  625.     INDEX_TYPE n = iv->iNelm; 
  626.     void *val = iv->iArray; 
  627.     void *nval = iv2->iArray; 
  628.  
  629.     switch (iv2->iType) { 
  630.         case AT_CHAR: 
  631.         switch (iv->iType) { 
  632.             case AT_SHRT: CONV(char, short); break; 
  633.             case AT_USHT: CONV(char, _ushort); break; 
  634.             case AT_INT: CONV(char, int); break; 
  635.             case AT_LONG: CONV(char, long); break; 
  636.             case AT_FLOT: CONVFI(char, float); break; 
  637.             case AT_DBLE: CONVFI(char, double); break; 
  638.             case AT_BIT: CONVFB(char); break; 
  639.             default: return(1); break; 
  640.         } 
  641.         break; 
  642.         case AT_SHRT: 
  643.         switch (iv->iType) { 
  644.             case AT_CHAR: CONV(short, char); break; 
  645.             case AT_USHT: CONV(short, _ushort); break; 
  646.             case AT_INT: CONV(short, int); break; 
  647.             case AT_LONG: CONV(short, long); break; 
  648.             case AT_FLOT: CONVFI(short, float); break; 
  649.             case AT_DBLE: CONVFI(short, double); break; 
  650.             case AT_BIT: CONVFB(short); break; 
  651.             default: return(1); break; 
  652.         } 
  653.         break; 
  654.         case AT_USHT: 
  655.         switch (iv->iType) { 
  656.             case AT_CHAR: CONV(_ushort, char); break; 
  657.             case AT_SHRT: CONV(_ushort, short); break; 
  658.             case AT_INT: CONV(_ushort, int); break; 
  659.             case AT_LONG: CONV(_ushort, long); break; 
  660.             case AT_FLOT: CONVFI(_ushort, float); break; 
  661.             case AT_DBLE: CONVFI(_ushort, double); break; 
  662.             case AT_BIT: CONVFB(_ushort); break; 
  663.             default: return(1); break; 
  664.         } 
  665.         break; 
  666.         case AT_INT: 
  667.         switch (iv->iType) { 
  668.             case AT_CHAR: CONV(int, char); break; 
  669.             case AT_SHRT: CONV(int, short); break; 
  670.             case AT_USHT: CONV(int, _ushort); break; 
  671.             case AT_LONG: CONV(int, long); break; 
  672.             case AT_FLOT: CONVFI(int, float); break; 
  673.             case AT_DBLE: CONVFI(int, double); break; 
  674.             case AT_BIT: CONVFB(int); break; 
  675.             default: return(1); break; 
  676.         } 
  677.         break; 
  678.         case AT_LONG: 
  679.         switch (iv->iType) { 
  680.             case AT_CHAR: CONV(long, char); break; 
  681.             case AT_SHRT: CONV(long, short); break; 
  682.             case AT_USHT: CONV(long, _ushort); break; 
  683.             case AT_INT: CONV(long, int); break; 
  684.             case AT_FLOT: CONVFI(long, float); break; 
  685.             case AT_DBLE: CONVFI(long, double); break; 
  686.             case AT_BIT: CONVFB(long); break; 
  687.             default: return(1); break; 
  688.         } 
  689.         break; 
  690.         case AT_FLOT: 
  691.         switch (iv->iType) { 
  692.             case AT_CHAR: CONV(float, char); break; 
  693.             case AT_SHRT: CONV(float, short); break; 
  694.             case AT_USHT: CONV(float, _ushort); break; 
  695.             case AT_INT: CONV(float, int); break; 
  696.             case AT_LONG: CONV(float, long); break; 
  697.             case AT_DBLE: CONV(float, double); break; 
  698.             case AT_BIT: CONVFB(float); break; 
  699.             default: return(1); break; 
  700.         } 
  701.         break; 
  702.         case AT_DBLE: 
  703.         switch (iv->iType) { 
  704.             case AT_CHAR: CONV(double, char); break; 
  705.             case AT_SHRT: CONV(double, short); break; 
  706.             case AT_USHT: CONV(double, _ushort); break; 
  707.             case AT_INT: CONV(double, int); break; 
  708.             case AT_LONG: CONV(double, long); break; 
  709.             case AT_FLOT: CONVFD(); break; 
  710.             case AT_BIT: CONVFB(double); break; 
  711.             default: return(1); break; 
  712.         } 
  713.         break; 
  714.         case AT_BIT: 
  715.         switch (iv->iType) { 
  716.             case AT_CHAR: CONVTB(char); break; 
  717.             case AT_SHRT: CONVTB(short); break; 
  718.             case AT_USHT: CONVTB(_ushort); break; 
  719.             case AT_INT: CONVTB(int); break; 
  720.             case AT_LONG: CONVTB(long); break; 
  721.             case AT_FLOT: CONVTB(float); break; 
  722.             case AT_DBLE: CONVTB(double); break; 
  723.             default: return(1); break; 
  724.         } 
  725.         break; 
  726.         default: return(1); break; 
  727.     } 
  728.     return(0); 
  729.  
  730. imeth objrtn Array_im_gCopy(object self)
  731.     return Dup(self, 0, 1, 0); 
  732.  
  733. imeth objrtn Array_im_gDeepCopy(object self)
  734.     return Dup(self, 0, 1, 1); 
  735.  
  736. cmeth objrtn Array_cm_gIndexOrigin(object self, int n)
  737.     Index_origin = n; 
  738.     return self; 
  739.  
  740. #line 781 "array.c"
  741.  
  742. objrtn    Array_initialize(void)
  743. {
  744.     static  CRITICALSECTION  cs;
  745.     static  int volatile once = 0;
  746.  
  747.     ENTERCRITICALSECTION(_CI_CS_);
  748.     if (!once) {
  749.         INITIALIZECRITICALSECTION(cs);
  750.         once = 1;
  751.     }
  752.     LEAVECRITICALSECTION(_CI_CS_);
  753.  
  754.     ENTERCRITICALSECTION(cs);
  755.  
  756.     if (Array_c) {
  757.         LEAVECRITICALSECTION(cs);
  758.         return Array_c;
  759.     }
  760.     INHIBIT_THREADER;
  761.     Array_c = gNewClass(Class, "Array", sizeof(Array_iv_t), 0, END);
  762.     cMethodFor(Array, gIndexOrigin, Array_cm_gIndexOrigin);
  763.     cMethodFor(Array, gNew, Array_cm_gNew);
  764.     cMethodFor(Array, gIota, Array_cm_gIota);
  765.     cMethodFor(Array, gNewArray, Array_cm_gNewArray);
  766.     ivMethodFor(Array, vReshape, Array_ivm_vReshape, Array_ifm_vReshape);
  767.     iMethodFor(Array, gArrayPointer, Array_im_gArrayPointer);
  768.     iMethodFor(Array, gShape, Array_im_gShape);
  769.     iMethodFor(Array, gSize, Array_im_gSize);
  770.     iMethodFor(Array, gDispose, Array_im_gDispose);
  771.     iMethodFor(Array, gEqual, Array_im_gEqual);
  772.     ivMethodFor(Array, vChangeBitValue, Array_ivm_vChangeBitValue, Array_ifm_vChangeBitValue);
  773.     iMethodFor(Array, gGCDispose, Array_im_gDispose);
  774.     ivMethodFor(Array, vBitValue, Array_ivm_vBitValue, Array_ifm_vBitValue);
  775.     iMethodFor(Array, gRank, Array_im_gRank);
  776.     iMethodFor(Array, gStringRepValue, Array_im_gStringRepValue);
  777.     iMethodFor(Array, gCopy, Array_im_gCopy);
  778.     iMethodFor(Array, gDeepDispose, Array_im_gDeepDispose);
  779.     iMethodFor(Array, gIndex, Array_im_gIndex);
  780.     iMethodFor(Array, gStringRep, Array_im_gStringRep);
  781.     iMethodFor(Array, gDeepCopy, Array_im_gDeepCopy);
  782.  
  783.     ENABLE_THREADER;
  784.  
  785.     LEAVECRITICALSECTION(cs);
  786.  
  787.     return Array_c;
  788. }
  789.  
  790.  
  791.  
  792.